package com.neuedu.javase.collection;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/***
 * 项目名称:  MyJavaSE 
 * 包：  com.neuedu.javase.collection 
 * date:   2025/10/31   10:59  
 * 描述:  
 *  @author : 张金山
 *  作者博客:   https://blog.fulfill.com.cn
 */
public class MyLinedList {

    //因为数组不可边长，当数据超过数组长度的时候 需要对数组 copy  创建新数组 扩容
    public static void main(String[] args) {

        //CTRL+ 鼠标左键
        /**
         *  LinedkList     fisrt  last     ->   Node{   p   next   Element}
         *   list = new LinkedList()        first；   null    last ：null
         *          add("张三)       newNode =  new Node( last , "张三" , null  )    first；   张三    last ：张三
         *          add("李四)       newNode =  new Node(  Node[“张三] , "李四" , null  )    new Node( last , "张三" , “李四"  )
         *          add("王五)       newNode =  new Node(  Node[“李四] , "王五" , null  )    new Node(  Node[“张三] , "李四" , "王五"  )
         *
         */

        //1 创建容器   面相接口编程
        //1.1 使用无参 的构造方法，创建一个 空白的容器
        // List list = new LinkedList( );



        /**
         * Exception in thread "main" java.lang.UnsupportedOperationException
         * 	at java.base/java.util.AbstractList.add(AbstractList.java:153)
         * 	at java.base/java.util.AbstractList.add(AbstractList.java:111)
         * 	at com.neuedu.javase.collection.MyLinedList.main(MyLinedList.java:36)
         */
        List listOrigin = Arrays.asList("张安","李四","王五");
        // listOrigin.add("赵六");

        //使用一个 可以操作的集合类包裹下

        LinkedList list = new LinkedList( Arrays.asList("张安","李四","王五"));


        list.add("赵六");

        System.out.println("初始的List;  "+list);

        // 2.3 长度   list.size() = 4
        System.out.println("list.size() = " + list.size());


        System.out.println("==========================remove ==================================");
        //2.4 删除元素
        // list.remove(Object )  //删除指定对象   一个对象存储了多次，只会移除 第一个
        // list.remove(index ) //删除指定下标的   返回的是 已经删除的元素
        //
        System.out.println("list.remove(张安) = " + list.remove("张安"));
        System.out.println("删除完remove（Object）;  "+list);

        System.out.println("list.remove(2) = " + list.remove(2));
        System.out.println("删除完remove（index）;  "+list);
        //
        // System.out.println("==========================判断集合中元素的方法 ==================================");

        List list1 = new LinkedList();

        //不可改
        List list2 = Arrays.asList("张安","李四","王五");
        List list3 = Arrays.asList("张安","李四","赵六");
        //
        list1.add("张安");
        list1.add("李四");
        list1.add("王五");
        System.out.println("list1 = " + list1);
        System.out.println("list2 = " + list2);
        System.out.println("list3 = " + list3);
        System.out.println("list1.contains('张安') = " + list1.contains("张安"));   //true
        System.out.println("list1.contains(stu4) = " + list1.contains("赵六"));   //false
        //
        System.out.println("list1.containsAll(list2) = " + list1.containsAll(list2));  //true
        System.out.println("list1.containsAll(list3) = " + list1.containsAll(list3));  // false
        //
        System.out.println("list1 = " + list1);
        System.out.println("list1.isEmpty() = " + list1.isEmpty());  //false
        //
        list1.clear();//清空元素
        System.out.println("list1.clear(); = " + list1);
        System.out.println("list1.isEmpty() = " + list1.isEmpty());  //true
        //
        //
        System.out.println("===================retainAll============================");
        list1.add("张安");
        list1.add("李四");
        list1.add("王五");
        list1.add("赵琦");

        System.out.println("retainAll before list1 = " + list1);
        System.out.println("retainAll before list2 = " + list2);
        list1.retainAll(list2);
        System.out.println("retainAll after list1 = " + list1);
        System.out.println("retainAll after list2 = " + list2);


        //集合的遍历

        // List list5 = new ArrayList(   Arrays.asList(new Person(1 ,  "张三"), new Person(2 ,  "李四"), new Person(3 ,  "王五"))   );
        // Object[] array = list5.toArray();
        // for (int i = 0; i < array.length; i++) {
        //     System.out.println("使用数组遍历array[i] = " + array[i]);
        // }



        //使用迭代器遍历
        // Iterator iterator = list5.iterator();
        // while (iterator.hasNext()){
        //     Object element = iterator.next();
        //     System.out.println(" while (iterator.hasNext()){ element = " + element);
        // }
        // for(   Iterator it = list5.iterator()    ;  it.hasNext()        ;    ){
        //     System.out.println("for  + Iterator ： "+it.next());
        // }

        // list5.get(index)  获取指定下标的元素   配合size 做遍历
        // System.out.println("list5.get(0) = " + list5.get(0));
        // System.out.println("list5.get(1) = " + list5.get(1));

        // for (int i = 0; i < list5.size(); i++) {
        //     System.out.println("list5.get("+i+") = " + list5.get(i));
        // }


        //JDK 5+   对数组、集合  Set、List
        // for( Object el: list5   ){
        //     System.out.println(" for( Object el: list5   ){ "+el);
        // }

        // int ages[] = new int[]{100,200,300};
        // for( int age: ages   ){
        //     System.out.println("  for( int age: ages   ){  "+age);
        // }



        //forEach  java 8 提供的函数式接口
        // list5.forEach(new Consumer() {
        //     @Override
        //     public void accept(Object o) {
        //         System.out.println(o);
        //     }
        // });



        //函数式接口可以省略
        // list5.forEach(
        //   (Object o) ->{
        //         System.out.println(o);
        //     }
        // );


        //简写，省略 参数括号 类型
        // list5.forEach(
        //          item->{
        //             System.out.println(item);
        //         }
        // );

        //简写，省略 参数括号 类型
        // list5.forEach(
        //         item->  System.out.println(item)
        // );

        //forEach 需要的就是一个  接受参数的方法
        // list5.forEach(   System.out::println   );


    }
}


class Person {


    private Integer id ;
    private String name ;

    public Person() {
    }

    public Person(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
